package cn.tedu._05weibo.controller;

import cn.tedu._05weibo.common.response.JsonResult;
import cn.tedu._05weibo.common.response.StatusCode;
import cn.tedu._05weibo.mapper.UserMapper;
import cn.tedu._05weibo.pojo.dto.UserLoginDTO;
import cn.tedu._05weibo.pojo.dto.UserRegDTO;
import cn.tedu._05weibo.pojo.entity.User;
import cn.tedu._05weibo.pojo.vo.userVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import lombok.extern.slf4j.XSlf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import javax.servlet.http.HttpSession;
import java.util.Date;

@Slf4j
@Api(tags = "01.用户模块")
@RestController
@RequestMapping("v1/users/")
public class UserController {
    //    自动装配
    @Autowired
    private UserMapper userMapper;

    /* 1. 注册功能
     *
     * web 发送到 服务器 是DTO
     * 服务器 发送到 web 是VO
     *
     *  @ResonseBody 注解:   JAVA对象 --> JSON格式 --> WEB 前端
     *  @RequestBody 注解    JS  对象 --> JSON格式 --> JAVA后端
     * */
    @ApiOperation("注册功能")
    @PostMapping("reg")
    public JsonResult reg(@RequestBody  @Validated UserRegDTO userRegDTO) {
//        soutp+ 回车
        log.debug("userRegDTO = " + userRegDTO);

//        效验用户是否被占用
        userVO userVO = userMapper.selectByUsername(userRegDTO.getUsername());
        if (userVO != null) { // 找到用户名重复的数据
//            [全参构造器]
            return new JsonResult(StatusCode.USERNAME_ALREADY_EXISTS);
        }

//        数据未被占用
        User user = new User();
        BeanUtils.copyProperties(userRegDTO, user);
        user.setCreated(new Date());
        userMapper.insert(user);
        return JsonResult.ok();
    }

    /*
     *  返回值参数--注解
     *   1.登录成功
     *   2.密码错误
     *   3.用户名不正确
     * */
    @ApiOperation("登录功能")
    @PostMapping("login")
    public JsonResult login(@RequestBody UserLoginDTO userLoginDTO, @ApiIgnore HttpSession session) {
        log.debug("userLoginDTO = " + userLoginDTO);

        userVO userVO = userMapper.selectByUsername(userLoginDTO.getUsername());
        if (userVO == null) { //用户名错误
            return new JsonResult(StatusCode.USERNAME_ERROR);
        }

//        对密码进行比对
        if (userLoginDTO.getPassword().equals(userVO.getPassword())) {
            session.setAttribute("user", userVO);
//            登录成功
            return new JsonResult(StatusCode.LOGIN_SUCCESS);
        }

//        密码错误
        return new JsonResult(StatusCode.PASSWORD_ERROR);
    }

    /*
     * 3.获取当前用户功能
     *   3.1 拿到用户
     *   3.2 没拿到用户
     * */
    @ApiOperation("获取当前用户信息")
    @GetMapping("currentUser")
    public JsonResult currentUser(@ApiIgnore HttpSession session) {
        userVO userVO = (userVO) session.getAttribute("user");

        return JsonResult.ok(userVO);
    }

//    4.退出登录功能
    @ApiOperation("退出登录")
    @GetMapping("logout")
    public JsonResult logout(@ApiIgnore HttpSession session) {
//        删除服务器端的会话唯一标识
        session.removeAttribute("user");
        return JsonResult.ok();
    }


}
